package com.testing.class7;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class JsonTest {
    public static void main(String[] args) {
        String ipResult="jQuery1102029793080973590014_1607261163703({\"ResultCode\":\"0\",\"ResultNum\":\"1\",\"Result\":[{\"DisplayData\":{\"strategy\":{\"tempName\":\"ip\",\"precharge\":\"0\",\"ctplOrPhp\":\"1\"},\"resultData\":{\"tplData\":{\"srcid\":\"5809\",\"resourceid\":\"5809\",\"OriginQuery\":\"3.3.3.3\",\"origipquery\":\"3.3.3.3\",\"query\":\"3.3.3.3\",\"origip\":\"3.3.3.3\",\"location\":\"\\u7f8e\\u56fd \\u4e9a\\u9a6c\\u900a\\u4e91\",\"userip\":\"\",\"showlamp\":\"1\",\"tplt\":\"ip\",\"titlecont\":\"IP\\u5730\\u5740\\u67e5\\u8be2\",\"realurl\":\"http:\\/\\/www.ip138.com\\/\",\"showLikeShare\":\"1\",\"shareImage\":\"1\",\"data_source\":\"AE\"},\"extData\":{\"tplt\":\"ip\",\"resourceid\":\"5809\",\"OriginQuery\":\"3.3.3.3\"}}},\"ResultURL\":\"http:\\/\\/www.ip138.com\\/\",\"Weight\":\"2\",\"Sort\":\"1\",\"SrcID\":\"5809\",\"ClickNeed\":\"0\",\"SubResult\":[],\"SubResNum\":\"0\",\"ar_passthrough\":[],\"RecoverCacheTime\":\"0\"}],\"QueryID\":\"172091755\",\"Srcid\":\"5809\",\"status\":\"0\",\"data\":[{\"srcid\":\"5809\",\"resourceid\":\"5809\",\"OriginQuery\":\"3.3.3.3\",\"origipquery\":\"3.3.3.3\",\"query\":\"3.3.3.3\",\"origip\":\"3.3.3.3\",\"location\":\"\\u7f8e\\u56fd \\u4e9a\\u9a6c\\u900a\\u4e91\",\"userip\":\"\",\"showlamp\":\"1\",\"tplt\":\"ip\",\"titlecont\":\"IP\\u5730\\u5740\\u67e5\\u8be2\",\"realurl\":\"http:\\/\\/www.ip138.com\\/\",\"showLikeShare\":\"1\",\"shareImage\":\"1\"}]})";
        //提取符合条件的以{开头，}]}结尾的字符串。用正则表达式来表达这个规则。
        //用(.*?)来表示需要获取的内容，是个长度不定的任意字符组成的词组
        String regex= "\\{(.*?)\\}\\]\\}";
        //基于正则表达式创建一个模板
        Pattern ipPattern=Pattern.compile(regex);
        //基于模板，去为想要匹配的字符串，创建一个匹配器。
        Matcher ipMatcher=ipPattern.matcher(ipResult);
        //进行查找
        ipMatcher.find();
        System.out.println(ipMatcher);
        //查找结果分成两部分，放在匹配结果数组里，一个是包含{ }]}的内容,group(0)
        String ipJson=ipMatcher.group(0);
        System.out.println(ipMatcher.group(0));
        //一个是只包含(.*?)里面的内容,group(1)也就是通过正则表达式里的()进行区分，一个小括号就是一个group。
        System.out.println(ipMatcher.group(1));


        //解析json：
        //把json中的内容，存储到Map里面。
        Map<String,String> ipMap=new HashMap<String,String>();
        //将一个字符串，解析成为jsonObject对象。
        JSONObject ipJsonObject = JSON.parseObject(ipJson);
        //遍历jsonobject
        //通过jsonObject的键集合进行遍历。
        for (String key : ipJsonObject.keySet()) {
            //调用输出的时候，其实隐式调用了toString的方法。
//            System.out.println(key+"的值是"+ipJsonObject.get(key));
            //由于get方法获取到的是Object类型的对象，而Map指定的value类型是string，所以统一toString进行转换。
            ipMap.put(key,ipJsonObject.get(key).toString());
        }
        System.out.println("转换成map格式的结果是"+ipMap);



        //已知Result存储的内容是一个数组，里面的值是一个json，那么解析的时候，可以把Result获取为一个JsonArray对象
        //1、通过get获取到Object,然后强转为JsonArray
        JSONArray resultArray = (JSONArray) ipJsonObject.get("Result");
        //2、直接通过getJsonArray方法，获取出来就是个JsonArray类型的对象。
//        JSONArray dataArray1=ipJsonObject.getJSONArray("data");
        System.out.println("Result数组的值是"+resultArray);
        //类似于一个list，将resultarray这个对象中的内容按下标进行取值。
        //获取的时候获取的是Object类型，强转为JSONObject
        JSONObject resultJson = (JSONObject) resultArray.get(0);
        System.out.println("resultJson的结果是"+resultJson);

        //对于子Json的解析：
        //遍历resultJson这个JSonObject对象，通过键的keyset进行遍历。
        Map<String,Object> resultMap=new HashMap<>();
        for (String resultkey : resultJson.keySet()) {
            resultMap.put(resultkey,resultJson.get(resultkey));
        }
        System.out.println("子Json的值是"+resultMap);


    }
}
